﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain.Model.Repositories;
using Domain.Model.SecretariasDeTransito;
using Domain.Model.LicenciasDeConduccion;
using Domain.Model.Base;
using Infrastructure.Base.Persistence;
using Domain.Model.Direcciones;

namespace Infrastructure.Base.InDatabase
{

    public class BSecretariaDeTransitoRepository : SecretariaDeTransitoRepository
    {
        private List< SecretariaDeTransito> lista;

        public BSecretariaDeTransitoRepository()
        {
            this.lista = new List< SecretariaDeTransito>();

        }

        #region Métodos Heredados Generales

        public override void Insert(SecretariaDeTransito entity)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblSecretariaDeTransito obj = new TblSecretariaDeTransito();

            //Identidad
            obj.id = entity.Identity.Value.ToString();

            //Llaves Foráneas
            
            //Campos Propios
            obj.nit = entity.Nit;
            obj.razonSocial = entity.RazonSocial;

            //Objetos de Valor
            obj.domicilio = entity.Direccion.Domicilio;
            obj.municipio = entity.Direccion.Municipio;
            obj.localidad = entity.Direccion.Localidad;
            obj.codigoPostal = entity.Direccion.CodigoPostal;

            contexto.AddToTblSecretariaDeTransito(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override SecretariaDeTransito FromId(ObjectIdentity id)
        {
            String idString = id.Value.ToString();
            ContextoInfraccion contexto = new ContextoInfraccion();
            
            TblSecretariaDeTransito item = contexto.TblSecretariaDeTransito.Where(S => S.id == idString).FirstOrDefault();            
            contexto.Dispose();

            if (item != null)
            {
                SecretariaDeTransito oSecretaria = new SecretariaDeTransito(new SecretariaDeTransitoId(item.id), item.nit, item.razonSocial, new Direccion(item.domicilio, item.municipio, item.localidad, item.codigoPostal));

                //Asignar la llave primaria de la BD
                oSecretaria.PK = item.pk_secretaria;

                return oSecretaria;
            }

            return null;
        }

        public override ObjectIdentity NextIdentity()
        {
            return new SecretariaDeTransitoId(Guid.NewGuid().ToString().ToUpper());
        }

        public override void Update(SecretariaDeTransito entity)
        {
            String idString = entity.Identity.Value.ToString();                        
            ContextoInfraccion contexto = new ContextoInfraccion();
            
            TblSecretariaDeTransito obj = contexto.TblSecretariaDeTransito.Where(I => I.id == idString).FirstOrDefault();

            //Identidad
            obj.id = entity.Identity.Value.ToString();

            //Llaves Foráneas

            //Campos Propios
            obj.nit = entity.Nit;
            obj.razonSocial = entity.RazonSocial;

            //Objetos de Valor
            obj.domicilio = entity.Direccion.Domicilio;
            obj.municipio = entity.Direccion.Municipio;
            obj.localidad = entity.Direccion.Localidad;
            obj.codigoPostal = entity.Direccion.CodigoPostal;

            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override void Remove(ObjectIdentity id)
        {
            String idString = id.Value.ToString();
            ContextoInfraccion contexto = new ContextoInfraccion();
            
            TblSecretariaDeTransito obj = contexto.TblSecretariaDeTransito.Where(I => I.id == idString).FirstOrDefault();

            contexto.DeleteObject(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override List<SecretariaDeTransito> All()
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            List<TblSecretariaDeTransito> listaBD = new List<TblSecretariaDeTransito>();

            listaBD = contexto.TblSecretariaDeTransito.OrderBy(A => A.razonSocial).ToList();


            foreach (var item in listaBD)
            {
                SecretariaDeTransito obj = new SecretariaDeTransito(new SecretariaDeTransitoId(item.id), item.nit, item.razonSocial, new Direccion(item.domicilio, item.municipio, item.localidad, item.codigoPostal));
                lista.Add(obj);
            }

            contexto.Dispose();
            return lista;
        }

        public override int Count()
        {
            return All().Count;
        }

        #endregion
        
        #region Métodos Heredados Propios de SecretariaDeTransito

        public override LicenciaConduccion CreateLicenciaDeConduccion(LicenciaConduccion objetoValor)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblLicenciaConduccion tblLicenciaConduccion = new TblLicenciaConduccion();
            tblLicenciaConduccion.categoria = objetoValor.Categoria;
            tblLicenciaConduccion.fechaExpedicion = objetoValor.FechaExpedicion;
            tblLicenciaConduccion.fechaVencimiento = objetoValor.FechaVencimiento;
            tblLicenciaConduccion.numero = objetoValor.Numero;
            
            //Asociados
            SecretariaDeTransito secretariaTransito = this.FromId(objetoValor.SecretariaTransitoId);
            tblLicenciaConduccion.pk_secretaria = secretariaTransito.PK;

            contexto.AddToTblLicenciaConduccion(tblLicenciaConduccion);
            contexto.SaveChanges();
            contexto.Dispose();

            //Actualizar el valor de la llave primaria de la licencia de conducción
            objetoValor.PK = tblLicenciaConduccion.pk_licenciaconduccion;

            return objetoValor;
        }        

        #endregion

        #region Métodos de Base de Datos
        public SecretariaDeTransito FromPK(int pk)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblSecretariaDeTransito item = contexto.TblSecretariaDeTransito.Where(S => S.pk_secretaria == pk).FirstOrDefault();
            contexto.Dispose();

            SecretariaDeTransito oSecretaria = new SecretariaDeTransito(new SecretariaDeTransitoId(item.id), item.nit, item.razonSocial, new Direccion(item.domicilio, item.municipio, item.localidad, item.codigoPostal));
            
            //Asignar la llave primaria de la BD
            oSecretaria.PK = item.pk_secretaria;

            return oSecretaria;
        }

        public LicenciaConduccion LicenciaConduccionFromPK(int pk)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblLicenciaConduccion item = contexto.TblLicenciaConduccion.Where(I => I.pk_licenciaconduccion == pk).FirstOrDefault();
            contexto.Dispose();

            //Asociados
            SecretariaDeTransito secretariaTransito = this.FromPK((int)item.pk_secretaria);            
            LicenciaConduccion oLicencia = new LicenciaConduccion(item.numero, (DateTime)item.fechaExpedicion, (DateTime)item.fechaVencimiento, item.categoria, (SecretariaDeTransitoId)secretariaTransito.Identity);

            //Asignar la llave primaria de la BD
            oLicencia.PK = item.pk_licenciaconduccion;

            return oLicencia;
        }
        #endregion
    }
}
